package com.styletransfer.mapper;

import com.styletransfer.model.Combination;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 组合Mapper接口
 *
 * 这个接口定义了与组合表相关的数据库操作方法。
 * 使用MyBatis的注解方式，可以直接在接口方法上编写SQL语句。
 */
@Mapper
public interface CombinationMapper {

    /**
     * 根据ID查询组合
     *
     * @param id 组合ID
     * @return 组合对象
     */
    @Select("SELECT * FROM combination WHERE id = #{id}")
    Combination findById(Long id);

    /**
     * 插入组合
     *
     * @param combination 组合对象
     * @return 影响的行数
     */
    @Insert("INSERT INTO combination(name, description, previewImage, coverImage, creatorId, " +
            "useCount, likeCount, favoriteCount, isPublic, createTime, updateTime, status) " +
            "VALUES(#{name}, #{description}, #{previewImage},#{coverImage}, #{creatorId}, " +
            "#{useCount}, #{likeCount}, #{favoriteCount}, #{isPublic}, #{createTime}, #{updateTime}, #{status})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Combination combination);

    /**
     * 更新组合
     *
     * @param combination 组合对象
     * @return 影响的行数
     */
    @Update("UPDATE combination SET name = #{name}, description = #{description}, previewImage = #{previewImage}, " +
            "isPublic = #{isPublic}, updateTime = #{updateTime} WHERE id = #{id}")
    int update(Combination combination);

    /**
     * 更新组合状态
     *
     * @param id 组合ID
     * @param status 新状态
     * @return 影响的行数
     */
    @Update("UPDATE combination SET status = #{status}, updateTime = NOW() WHERE id = #{id}")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);

    /**
     * 增加组合使用次数
     *
     * @param id 组合ID
     * @return 影响的行数
     */
    @Update("UPDATE combination SET useCount = useCount + 1, updateTime = NOW() WHERE id = #{id}")
    int incrementUseCount(Long id);

    /**
     * 增加组合点赞数
     *
     * @param id 组合ID
     * @return 影响的行数
     */
    @Update("UPDATE combination SET likeCount = likeCount + 1, updateTime = NOW() WHERE id = #{id}")
    int incrementLikeCount(Long id);

    /**
     * 减少组合点赞数
     *
     * @param id 组合ID
     * @return 影响的行数
     */
    @Update("UPDATE combination SET likeCount = GREATEST(likeCount - 1, 0), updateTime = NOW() WHERE id = #{id}")
    int decrementLikeCount(Long id);

    /**
     * 增加组合收藏数
     *
     * @param id 组合ID
     * @return 影响的行数
     */
    @Update("UPDATE combination SET favoriteCount = favoriteCount + 1, updateTime = NOW() WHERE id = #{id}")
    int incrementFavoriteCount(Long id);

    /**
     * 减少组合收藏数
     *
     * @param id 组合ID
     * @return 影响的行数
     */
    @Update("UPDATE combination SET favoriteCount = GREATEST(favoriteCount - 1, 0), updateTime = NOW() WHERE id = #{id}")
    int decrementFavoriteCount(Long id);

    /**
     * 查询用户的组合
     *
     * @param userId 用户ID
     * @return 组合列表
     */
    @Select("SELECT * FROM combination WHERE userId = #{userId} AND status = 1 ORDER BY id DESC")
    List<Combination> findByUser(Long userId);

    /**
     * 查询公开的组合
     *
     * @return 组合列表
     */
    @Select("SELECT * FROM combination WHERE isPublic = 1 AND status = 1 ORDER BY id DESC")
    List<Combination> findPublic();

    /**
     * 查询热门组合
     *
     * @param limit 限制数
     * @return 组合列表
     */
    @Select("SELECT * FROM combination WHERE isPublic = 1 AND status = 1 ORDER BY useCount DESC LIMIT #{limit}")
    List<Combination> findHot(Integer limit);

    /**
     * 查询最新组合
     *
     * @param limit 限制数
     * @return 组合列表
     */
    @Select("SELECT * FROM combination WHERE isPublic = 1 AND status = 1 ORDER BY createTime DESC LIMIT #{limit}")
    List<Combination> findLatest(Integer limit);

    /**
     * 搜索组合
     *
     * @param keyword 关键词
     * @return 组合列表
     */
    @Select("SELECT * FROM combination WHERE isPublic = 1 AND status = 1 AND (name LIKE CONCAT('%', #{keyword}, '%') OR description LIKE CONCAT('%', #{keyword}, '%')) ORDER BY id DESC")
    List<Combination> search(String keyword);

    /**
     * 分页查询组合
     *
     * @param offset 偏移量
     * @param limit 限制数
     * @return 组合列表
     */
    @Select("SELECT * FROM combination WHERE isPublic = 1 AND status = 1 ORDER BY id DESC LIMIT #{offset}, #{limit}")
    List<Combination> findByPage(@Param("offset") Integer offset, @Param("limit") Integer limit);

    /**
     * 统计组合总数
     *
     * @return 组合总数
     */
    @Select("SELECT COUNT(*) FROM combination WHERE isPublic = 1 AND status = 1")
    Long count();

    /**
     * 统计用户组合总数
     *
     * @param userId 用户ID
     * @return 组合总数
     */
    @Select("SELECT COUNT(*) FROM combination WHERE userId = #{userId} AND status = 1")
    Long countByUser(Long userId);
}
